/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mwt.xml.xdbforms.dblayer.query.impl;

import java.util.ArrayList;
import java.util.List;
import mwt.xml.xdbforms.dblayer.query.Criteria;
import mwt.xml.xdbforms.dblayer.query.Projections;
import mwt.xml.xdbforms.dblayer.query.SQLOperation;

/**
 * Definisce un operazione di lettura
 * da database con filtro personalizzato, ossia
 * con un numero variabile di clausole poste in and
 *<i>NOTA</i>: per il dominio considerato questa
 * classe servirà solo ad estrapolare i dati di una
 * singola riga del database in modo da costruire
 * tutti gli artefatti utili ad una form di aggiornamento
 * o per definire i campi validi per l'inserimento
 * delle reference key.
 * Per vedere una descrizione dei metodi fare riferiemento all'interfaccia
 * SQLOperation.
 * @see SQLOperation
 * @author Gianfranco Murador, Matteo Ferri, Cristian Castiglia
 */
public class SQLQuery extends SQLOperation {

    private StringBuilder statement;
    private List<SQLParameter> parameters = null;
    private Projections projections = null;
    private Criteria criteria = null;
    private String table = null;
    private List<Object> values = null;
    private boolean isCompiled = false;

    public SQLQuery(String table) {

        statement = new StringBuilder();
        parameters = new ArrayList<SQLParameter>();
        values = new ArrayList<Object>();
        this.table = table;

    }

    /**
     * Verifica la correttezza della stringa
     */
    @Override
    public void compile() throws RuntimeException {
        /*
        int paramLength = parameters.size();
        int valuesLength = values.size();

        
        if (paramLength != valuesLength) {
        throw new RuntimeException("Error, parameters and values mismatch");
        }*/

        if (projections == null) {

            statement.append("SELECT * FROM " + table);

        } else {
            statement.append("SELECT ");
            statement.append(projections.toSqlString());
            statement.append(" FROM " + table);
        }

        if (criteria != null) {
            statement.append(" WHERE " + criteria.toSqlString());
        }
        isCompiled = true;

    }

    @Override
    public String toString() {

        if (isCompiled) {
            return statement.toString();
        } else {
            compile();
            return statement.toString();

        }
    }

    @Override
    public List<SQLParameter> getParameters() {
        return parameters;
    }

    @Override
    public Object[] getValues() {
        return values.toArray();
    }

    @Override
    public void addProjections(Projections p) {
        projections = p;
    }

    @Override
    public void addCriteria(Criteria c) {
        if (criteria == null) {
            criteria = c;
            //  values.add(c.getValues());
            Object[] v = c.getValues();

            for (int i = 0; i < v.length; i++) {
                Object object = v[i];

                System.out.println("SQLQuery: "+object.toString());
                values.add(object);
                
            }

        }
    }
}
